<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>深拷贝</title>
</head>
<body>

</body>
<script>
    // 1、使用JSON.stringify()以及JSON.parse()
    // JSON.stringify(obj); // 将对象转换为json字符串形式
    // JSON.parse(_tmp); // 将转换而来的字符串转换为原生js对象
    const obj = {
        a: 1,
        b: 2,
        c: 3
    }
    const copyObj = JSON.parse(JSON.stringify(obj))
    copyObj.a = 5;
    console.log(obj.a);  // 1
    console.log(copyObj.a); // 5 修改copyObj的数据，并不会对obj造成任何影响
    // 注意：JSON.stringify()以及JSON.parse()它是不可以拷贝 undefined ， function， RegExp 等等类型的
    // 2.递归 （自身调用自身）
    function deepClone1(obj) {
        //判断拷贝的要进行深拷贝的是数组还是对象，是数组的话进行数组拷贝，对象的话进行对象拷贝
        const objClone = Array.isArray(obj) ? [] : {};
        //进行深拷贝的不能为空，并且是对象或者是
        if (obj && typeof obj === "object") {
            for (key in obj) {
                if (obj.hasOwnProperty(key)) {
                    if (obj[key] && typeof obj[key] === "object") {
                        objClone[key] = deepClone1(obj[key]);
                    } else {
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }
    // concat()
    // 当数组中都是简单数据类型时
    let arr = [1, 2, false, 'a']
    let arr2 = [].concat(arr)
    arr[0] = 3
    console.log(arr) //  [3, 2, false, 'a']  arr中的数据更改，并不会影响arr2
    console.log(arr2) // [1, 2, false, 'a']
    // 如果数组中有复杂数据类型
    let arr3 = [1, 2, false, {a: 3}]
    let arr4 = [].concat(arr3)
    arr3[3].a = 4
    console.log(arr3) // [1, 2, false, {a: 4}]  arr3中的数据更改，arr4中的数据会跟着变
    console.log(arr4) // [1, 2, false, {a: 4}]
</script>
</html>
